#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

#define NBSOMMETMAX 200

typedef struct SOMMET_T {
	
	int id;
	int pref;
	int suff;
	struct SOMMET_T** voisin;
	
}sommet_t;


int main ( int argc , char** argv ) {

	srand(time(NULL));

	int fichier;
	char* buff;
	int** matrice;
	
	buff=(char*)malloc(100);
	
	sommet_t* tabsommet;
	
	int i=0,j=0,k=0,l=0;

	int nbsommet=0,nbarete=0;
	char reponse;
	
	//demande de random ou pas
	printf("Voulez vous une generation de graphe aleatoire (y/n) : ");
	while((reponse = getchar()) != 'y' && reponse != 'n'){
		printf("(y/n) svp : ");
	}
	
	if(reponse == 'y'){
	
		nbsommet=(int)((rand()%NBSOMMETMAX)+5);
		nbarete=(int)((rand()%((nbsommet*(nbsommet-1))/2)));
	}
	
	else{
		do{
			printf("Combien de sommet voulez vous dans le graphe ? : ");
			scanf("%d",&nbsommet);
		}while(nbsommet > NBSOMMETMAX);
		
		do{
			printf("Combien d'arrete voulez vous dans le graphe ? : ");
			scanf("%d",&nbarete);
		}while(nbarete > ((nbsommet*(nbsommet-1))/2));
		
	}
	
	tabsommet=(sommet_t*)malloc(nbsommet*sizeof(sommet_t));

	for(i=0;i<nbsommet;i++){
		tabsommet[i].voisin=(sommet_t**)malloc(nbsommet*sizeof(sommet_t*));
		tabsommet[i].id=i+1;
	}

	matrice=(int**)malloc(nbsommet*sizeof(int));
	for(i=0;i<nbsommet;i++) {
		matrice[i]=(int*)malloc(nbsommet*sizeof(int));
	}

	for(i=0;i<nbsommet;i++){
		for(j=0;j<nbsommet;j++){
			matrice[i][j]=0;
		}
	}
	
	printf("nbsommet : %d , nbarete : %d\n",nbsommet,nbarete);
	
	i=0;
	
	while(i<nbarete) {
		for(j=0;(j<nbsommet) && (i<nbarete) ;j++){
			for(k=0;(k<nbsommet)  && (i<nbarete) ;k++) {
				if( (( (int)rand()%2 )) ){
					while(tabsommet[k].voisin[l] != NULL )
						l++;
					tabsommet[k].voisin[l]=&tabsommet[j];
					matrice[k][j]=1;
					i++;
					l=0;
				}
			}
		}
	}

	fichier=open("GraphAdj.txt",O_WRONLY | O_CREAT | O_TRUNC,0771);

	write(fichier,"graph G {\n",10);
	for(i=0;i<nbsommet;i++) {
		
		sprintf(buff,"%d--{",tabsommet[i].id);
		write(fichier,buff,strlen(buff));
		memset(buff,'\0',100);
		j=0;
		while(tabsommet[i].voisin[j] != NULL) {
			sprintf(buff,"%d;",tabsommet[i].voisin[j]->id);
			write(fichier,buff,strlen(buff));
			memset(buff,'\0',100);
			j++;
		}
		write(fichier,"}\n",2);
	}
	write(fichier,"}\n",2);
	close(fichier);

	fichier=open("GraphMat.txt",O_WRONLY | O_CREAT | O_TRUNC,0771);

	write(fichier,"\n\t",2);

	for(i=0;i<nbsommet;i++){
		sprintf(buff,"%d\t",tabsommet[i].id);
		write(fichier,buff,strlen(buff));
		memset(buff,'\0',100);
	}
	write(fichier,"\n",1);

	for(i=0;i<nbsommet;i++){
		j=0;
		sprintf(buff,"%d\t",tabsommet[i].id);
		write(fichier,buff,strlen(buff));
		memset(buff,'\0',100);
		for(j=0;j<nbsommet;j++){
			sprintf(buff,"%d\t",matrice[i][j]);
			write(fichier,buff,strlen(buff));
			memset(buff,'\0',100);
		}			
		write(fichier,"\n",1);
	}


	close(fichier);
	
	return 0;
	
}
